아파치 메이븐
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
아파치 메이븐은 2002년 제이슨 반 질에 의해 개발된 자바 기반의 프로젝트 관리 및 자동화 도구이다. 메이븐은 프로젝트 객체 모델(POM)을 사용하여 프로젝트를 구성하며, 의존성 관리를 통해 라이브러리 관리를 용이하게 한다. 2004년 버전 1을 시작으로, 2010년 메이븐 3이 출시되었으며, 현재는 베타 버전인 메이븐 4가 개발 중이다. 메이븐은 플러그인을 통해 다양한 기능을 제공하며, 빌드 생명주기를 통해 작업 순서를 정의한다. 또한, 주요 통합 개발 환경(IDE)에서 지원되어 프로젝트 개발을 돕는다.
더 읽어볼만한 페이지
- 컴파일 도구 - Libtool
Libtool은 다양한 유닉스 계열 운영 체제에서 정적 및 동적 라이브러리 생성을 관리하고, 운영 체제별 차이로 인한 소프트웨어 이식 문제를 해결하기 위해 GNU 빌드 시스템에서 사용되는 도구이다. - 컴파일 도구 - GNU 빌드 시스템
GNU 빌드 시스템은 Autoconf, Automake, Libtool 등의 오토툴과 GNU make 등으로 구성되어 다양한 UNIX 시스템에서 소프트웨어 빌드 및 설치를 지원하지만, 복잡성과 이식성에 대한 비판도 존재한다. - 자바 플랫폼 소프트웨어 - 자바 데스크톱 시스템
- 자바 플랫폼 소프트웨어 - 핫자바
핫자바는 자바 프로그래밍 언어 기반으로 개발된 웹 브라우저이며, 1995년 TED 컨퍼런스에서 처음 시연되고 SunWorld 컨퍼런스에서 공식 발표되었다. - 아파치 소프트웨어 재단 프로젝트 - 아파치 루씬
아파치 루씬은 더그 커팅이 개발한 오픈 소스 전문 검색 라이브러리이며, 텍스트 색인 및 검색 기능을 제공하여 웹 검색 엔진, 퍼지 검색, 추천 시스템 구현 등에 사용된다. - 아파치 소프트웨어 재단 프로젝트 - 아파치 하둡
아파치 하둡은 대용량 데이터를 분산 처리하기 위한 자바 기반의 오픈 소스 프레임워크로, HDFS, 맵리듀스, YARN 등의 모듈로 구성되어 클라우드 환경에서도 사용된다.
아파치 메이븐 - [IT 관련 정보]에 관한 문서 | |
---|---|
기본 정보 | |
![]() | |
개발자 | 아파치 소프트웨어 재단 |
최초 출시일 | 2004년 7월 13일 |
안정화 버전 | 3.9.0 |
안정화 버전 출시일 | 2023년 1월 31일 |
프로그래밍 언어 | 자바 |
장르 | 빌드 도구 |
라이선스 | 아파치 라이선스 2.0 |
웹사이트 | 아파치 메이븐 공식 웹사이트 |
2. 역사
메이븐은 2002년 제이슨 반 질이 아파치 터빈의 하위 프로젝트로 시작하였다. 2003년에는 아파치 소프트웨어 재단의 최상위 레벨 프로젝트로 승격되었다.[19]
2. 1. 버전 기록
- '''버전 1''' (2004년 7월): 첫 번째 주요 릴리스이다. (현재 지원 종료)[19]
- '''버전 2''' (2005년 10월): 약 6개월간의 베타 기간 후 출시되었다. (현재 지원 종료)[19]
- '''버전 3''' (2010년 10월): 메이븐 2와의 하위 호환성을 유지하면서 핵심 빌더를 재작업하고 병렬 빌드를 지원하는 등 기능이 개선되었다.[19] 파일 기반 표현과 메모리 내 표현을 분리하여 XML 기반이 아닌 프로젝트 정의 파일(루비, YAML, Groovy 등)을 활용할 수 있게 되었다. 병렬 빌드 기능은 멀티 코어 머신에서 구성 가능한 코어 수를 활용하며, 특히 대규모 멀티 모듈 프로젝트에 적합하다.
- '''버전 4''': 현재 베타 개발 중이다. (2024년 5월 기준)
3. 문법
메이븐은 `pom.xml` 파일 내의 프로젝트 객체 모델(POM, Project Object Model)을 사용하여 구성된다.[1]
```xml
```
위 POM은 프로젝트의 고유 식별자(coordinates)와 JUnit 프레임워크 의존성을 정의한다.[1]
메이븐을 사용하면 사용자는 프로젝트 구성만 제공하면 되고, 구성 가능한 플러그인이 프로젝트 컴파일, 대상 디렉터리 정리, 단위 테스트 실행, API 문서 생성 등 실제 작업을 수행한다. 일반적으로 사용자는 플러그인을 직접 작성할 필요가 없다. 앤트 및 make와 비교하면, make에서는 앞서 언급한 작업을 수행하기 위해 명령형 절차를 작성해야 한다.[1]
3. 1. POM 예제
다음은 주어진 POM 예제에 대한 설명이다.```xml
```
위의 POM은 프로젝트의 고유 식별자(coordinates)와 JUnit 라이브러리에 대한 의존성을 정의한다. 메이븐은 '설정보다 관례(Convention over Configuration)' 원칙을 따르므로, 프로젝트 구성에 대한 기본값을 제공한다.
3. 2. 디렉터리 구조
아파치 메이븐은 `pom.xml` 파일 내의 프로젝트 객체 모델(POM)을 사용하여 구성된다.일반적인 메이븐 프로젝트의 디렉터리 구조는 다음과 같다.
디렉터리 이름 | 목적 |
---|---|
프로젝트 홈 | pom.xml 과 모든 하위 디렉터리를 포함한다. |
src/main/java | 프로젝트의 전달 가능한 Java 소스 코드를 포함한다. |
src/main/resources | 속성 파일 등 프로젝트의 전달 가능한 리소스를 포함한다. |
src/test/java | 프로젝트의 테스팅 Java 소스 코드(JUnit, TestNG 등)를 포함한다. |
src/test/resources | 테스트에 필요한 리소스를 포함한다. |
`mvn package` 명령은 모든 Java 파일을 컴파일하고, 모든 테스트를 실행하며, 전달 가능한 코드와 리소스를 `target/my-app-1.0.jar`(artifactId가 my-app이고 버전이 1.0이라고 가정)로 패키징한다.
4. 설계
아파치 메이븐은 소프트웨어 프로젝트의 빌드, 테스트, 배포 등을 자동화하는 도구이다. 메이븐은 주로 다음과 같은 설계 원칙을 기반으로 한다.
- 프로젝트 객체 모델 (POM): 프로젝트의 정보와 빌드 설정을 담고 있는 `pom.xml` 파일을 중심으로 동작한다.
- 플러그인: 메이븐의 기능은 대부분 플러그인 형태로 제공되며, `pom.xml` 파일에서 설정하거나 명령어를 통해 실행할 수 있다.
- 빌드 생명주기: 미리 정의된 빌드 단계를 통해 프로젝트를 빌드, 테스트, 배포한다.
- 의존성 관리: 프로젝트에 필요한 외부 라이브러리를 자동으로 다운로드하고 관리한다.
이러한 설계 원칙을 통해 메이븐은 프로젝트 관리를 효율적이고 일관성 있게 수행할 수 있도록 돕는다.
4. 1. 프로젝트 객체 모델 (POM)
프로젝트 객체 모델(POM, Project Object Model)은[6] 단일 프로젝트에 대한 모든 구성을 제공한다. 일반적인 구성에는 프로젝트 이름, 소유자 및 다른 프로젝트에 대한 종속성이 포함된다. 또한 플러그인으로 구현되는 빌드 프로세스의 개별 단계를 구성할 수도 있다. 예를 들어, 컴파일러 플러그인이 컴파일에 Java 버전 1.5를 사용하도록 구성하거나 일부 단위 테스트가 실패하더라도 프로젝트를 패키징하도록 지정할 수 있다.더 큰 프로젝트는 여러 모듈 또는 하위 프로젝트로 나뉘어야 하며, 각 모듈은 자체 POM을 갖는다. 그런 다음 단일 명령으로 모든 모듈을 컴파일할 수 있는 루트 POM을 작성할 수 있다. POM은 다른 POM에서 구성을 상속받을 수도 있다. 모든 POM은 기본적으로 수퍼 POM[7]에서 상속된다. 수퍼 POM은 기본 소스 디렉터리, 기본 플러그인 등과 같은 기본 구성을 제공한다.
4. 2. 플러그인 (Plug-ins)
메이븐 기능의 대부분은 플러그인에 있다. 플러그인은 `mvn [플러그인 이름]:[목표 이름]` 명령을 사용하여 실행할 수 있는 일련의 목표(Goal)를 제공한다. 예를 들어, `mvn compiler:compile`은 compiler-plugin의 compile-goal을 실행한다.[8]빌드, 테스트, 소스 제어 관리, 웹 서버 실행, 이클립스 프로젝트 파일 생성 등 다양한 기능을 위한 플러그인이 존재한다.[9] `pom.xml` 파일의 `
메이븐 플러그인을 개발하려면 `org.apache.maven.plugin.AbstractMojo` 클래스를 확장해야 한다.
4. 3. 빌드 생명주기 (Build Lifecycles)
빌드 라이프사이클은 목표 실행에 순서를 부여하는 데 사용되는 명명된 ''페이즈(Phase)'' 목록이다.[11] 메이븐의 표준 라이프사이클 중 하나인 ''기본 라이프사이클(default lifecycle)''은 다음 페이즈를 포함한다:[11]- validate (유효성 검사)
- generate-sources (소스 생성)
- process-sources (소스 처리)
- generate-resources (리소스 생성)
- process-resources (리소스 처리)
- compile (컴파일)
- process-test-sources (테스트 소스 처리)
- process-test-resources (테스트 리소스 처리)
- test-compile (테스트 컴파일)
- test (테스트)
- package (패키징)
- install (설치)
- deploy (배포)
플러그인에서 제공하는 목표는 라이프사이클의 다른 페이즈와 연결될 수 있다. 예를 들어, 기본적으로 `compiler:compile` 목표는 `compile` 페이즈와 연결되어 있으며, `surefire:test` 목표는 `test` 페이즈와 연결되어 있다.[11] `mvn test` 명령을 실행하면 메이븐은 `test` 페이즈까지 각 페이즈와 연결된 모든 목표를 실행한다. 이러한 경우 메이븐은 `process-resources` 페이즈와 연결된 `resources:resources` 목표를 실행한 다음, `compiler:compile`을 실행하고, 마지막으로 `surefire:test` 목표를 실행한다.[11]
메이븐에는 프로젝트를 정리하고 프로젝트 사이트를 생성하기 위한 표준 페이즈도 있다. 정리가 기본 라이프사이클의 일부라면, 프로젝트는 빌드될 때마다 정리될 것이다. 이것은 바람직하지 않으므로, 정리는 자체 라이프사이클을 갖게 되었다.[11]
표준 라이프사이클을 통해 프로젝트를 처음 접하는 사용자는 `mvn install` 단일 명령을 실행하여 모든 메이븐 프로젝트를 정확하게 빌드, 테스트 및 설치할 수 있다. 기본적으로 메이븐은 생성된 JAR 및 WAR 파일에 POM 파일을 패키징한다.[11]
4. 4. 의존성 관리
메이븐의 핵심 기능은 의존성 관리이다. 메이븐의 의존성 처리 메커니즘은 소프트웨어 라이브러리나 모듈과 같은 개별 아티팩트를 식별하는 좌표 시스템을 중심으로 구성된다. 위 POM 예제는 JUnit 좌표를 프로젝트의 직접적인 의존성으로 참조한다. 예를 들어 Hibernate 라이브러리가 필요한 프로젝트는 POM에 Hibernate 프로젝트 좌표를 선언하기만 하면 된다. 메이븐은 자동으로 의존성과 Hibernate 자체가 필요로 하는 의존성(이른바 전이적 의존성)을 다운로드하여 사용자의 로컬 저장소에 저장한다. 메이븐 2 [https://search.maven.org/ Central Repository][1]는 기본적으로 라이브러리 검색에 사용되지만, POM 내에서 사용될 저장소(예: 회사 전용 저장소)를 구성할 수 있다.The Central Repository Search Engine과 같은 검색 엔진[14]을 사용하여 다양한 오픈 소스 라이브러리 및 프레임워크의 좌표를 찾을 수 있다.
단일 머신에서 개발된 프로젝트는 로컬 저장소를 통해 서로 의존할 수 있다. 로컬 저장소는 다운로드된 의존성의 캐시 역할을 하고 로컬에서 빌드된 아티팩트의 중앙 집중식 저장소 역할을 하는 간단한 폴더 구조이다. 메이븐 명령
mvn install
은 프로젝트를 빌드하고 해당 바이너리를 로컬 저장소에 배치한다. 그런 다음 다른 프로젝트는 POM에 좌표를 지정하여 이 프로젝트를 활용할 수 있다.5. 외부 도구 및 통합 개발 환경(IDE) 지원
이클립스, 넷빈즈, 인텔리J는 기본적으로 메이븐을 지원하며, pom.xml을 IDE 프로젝트로 가져와 작업할 수 있다.
6. 특징 (일본어 문서 내용 보충)
플러그인 확장을 통해 다양한 방식으로 사용할 수 있다. 소스 코드 컴파일, 테스트, Javadoc 생성, 테스트 리포트 생성, 프로젝트 사이트 생성, JAR 생성, 서버에의 배포, WAR, EAR 파일 생성 등 다양한 기능이 제공된다. Ant의 경우 `build.xml`이라는 설정 파일에 세부적인 지시를 기록하여 수행했던 각 처리를, 메이븐에서는 대략적인 지시를 `pom.xml`에 기록하여 처리하는 형태를 취하고 있다.[3]
메이븐의 큰 특징은 `pom.xml`의 `
예를 들어, 개발 팀에서 프로젝트를 공유할 때 JAR 파일을 수동으로 다운로드, 설치, 업데이트할 필요 없이, `pom.xml` 파일과 필요한 소스 코드, 저장소에 등록되지 않은 JAR 파일만 배포하면 된다. 저장소에 등록되지 않은 JAR 파일은 직접 저장소를 생성하여 중앙 관리 및 배포할 수도 있다.[3]
메이븐은 플러그인을 통해 확장할 수도 있다.[3]
7. Maven 2와 Maven 3 (일본어 문서 내용 보충)
Maven 2는 Java로 다시 작성되어 여러 면에서 개선되었지만, Maven 1과는 호환성이 상당히 낮다. 그러나 Maven 1과 Maven 2에서 사용되는 파일명이 다르기 때문에, 하나의 Maven 프로젝트 디렉토리에서 설정 파일(project.xml, pom.xml 등)을 공유하고 병용할 수 있다. 2010년에는 Maven 3이 출시되었다.[19]
7. 1. Maven 2
Apache Jelly 및 Ant에 대한 의존성은 없어졌다. 또한, 스크립트 언어인 Groovy를 지원한다. `project.xml`은 `pom.xml`로 변경되어 문법이 바뀌었다. `project.properties`는 `settings.xml`로 변경되었다. Maven 1에서 사용하던 `maven.xml`은 `pom.xml`에 통합되었다.7. 2. Maven 3
2010년에는 Maven 3이 출시되었다. Maven 3에서는 Maven 2와의 하위 호환성을 확보하면서 각종 내부 구조를 대폭 갱신했다.[19]참조
[1]
웹사이트
Index of /maven2/
https://web.archive.[...]
2009-04-15
[2]
웹사이트
MojoHaus Native Maven Plugin
http://www.mojohaus.[...]
[3]
웹사이트
IBiblio Resolver | Apache Ivy™
https://ant.apache.o[...]
[4]
웹사이트
Reproducible/Verifiable Builds - Apache Maven - Apache Software Foundation
https://cwiki.apache[...]
[5]
웹사이트
Reproducible Builds in Java - DZone Java
https://dzone.com/ar[...]
[6]
문서
POM Reference
https://maven.apache[...]
[7]
문서
Super POM
https://maven.apache[...]
[8]
웹사이트
Apache Maven Compiler Plugin – Introduction
https://maven.apache[...]
[9]
웹사이트
Maven – Available Plugins
https://maven.apache[...]
[10]
간행물
Automate development and management of cloud virtual machines
http://www.ibm.com/d[...]
IBM
2011-10-29
[11]
웹사이트
Maven – Introduction to the Build Lifecycle
https://maven.apache[...]
[12]
웹사이트
diet4j - put Java JARs on a diet, and load maven modules as needed
http://diet4j.org/
[13]
웹사이트
Maven: The Complete Reference
https://web.archive.[...]
Sonatype
2013-04-11
[14]
문서
The Central Repository Search Engine
https://search.maven[...]
[15]
웹사이트
maven.apache.org/eclipse-plugin.html
https://web.archive.[...]
[16]
웹사이트
IntelliJ IDEA :: Features
https://web.archive.[...]
2009-09-02
[17]
웹사이트
MavenBestPractices - NetBeans Wiki
https://web.archive.[...]
2009-09-02
[18]
웹사이트
Maven Releases History
https://maven.apache[...]
2021-10-07
[19]
서적
Maven 3.0リリース
http://www.infoq.com[...]
InfoQ
2016-04-30
[20]
웹인용
Maven Release Notes – Maven 3.8.7
https://maven.apache[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com